From: Keir Fraser Date: Thu, 10 Jun 2010 07:19:58 +0000 (+0100) Subject: x86 mce: Dump the MCE information in mc_panic and softirq X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11964 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=b1f87cc667c359dc7c2666d093702ee1ab66e6da;p=xen.git x86 mce: Dump the MCE information in mc_panic and softirq We should not dump the mcinfo in mce handler, instead, we should do that in mc_panic for fatal error or softirq for other errors. Signed-off-by: Jiang, Yunhong Acked-By: Christoph Egger --- diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c index ff36ed9d20..c35659b6dc 100644 --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -1509,15 +1509,39 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u_xen_mc) return ret; } +int mcinfo_dumpped; +static int x86_mcinfo_dump_panic(mctelem_cookie_t mctc) +{ + struct mc_info *mcip = mctelem_dataptr(mctc); + + x86_mcinfo_dump(mcip); + mcinfo_dumpped++; + + return 0; +} + +/* XXX shall we dump commited mc_info?? */ +static void mc_panic_dump(void) +{ + int cpu; + + dprintk(XENLOG_ERR, "Begin dump mc_info\n"); + for_each_online_cpu(cpu) + mctelem_process_deferred(cpu, x86_mcinfo_dump_panic); + dprintk(XENLOG_ERR, "End dump mc_info, %x mcinfo dumped\n", mcinfo_dumpped); +} + void mc_panic(char *s) { is_mc_panic = 1; console_force_unlock(); + printk("Fatal machine check: %s\n", s); printk("\n" "****************************************\n" "\n" " The processor has reported a hardware error which cannot\n" " be recovered from. Xen will now reboot the machine.\n"); + mc_panic_dump(); panic("HARDWARE ERROR"); } diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index 58f7604b51..0e28893589 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -257,6 +257,8 @@ static int mce_delayed_action(mctelem_cookie_t mctc) switch (result) { case MCER_RESET: + dprintk(XENLOG_ERR, "MCE delayed action failed\n"); + x86_mcinfo_dump(mctelem_dataptr(mctc)); panic("MCE: Software recovery failed for the UCR\n"); break; case MCER_RECOVERED: @@ -266,6 +268,7 @@ static int mce_delayed_action(mctelem_cookie_t mctc) case MCER_CONTINUE: dprintk(XENLOG_INFO, "MCE: Error can't be recovered, " "system is tainted\n"); + x86_mcinfo_dump(mctelem_dataptr(mctc)); ret = 1; break; default: @@ -755,10 +758,6 @@ static void intel_machine_check(struct cpu_user_regs * regs, long error_code) mctc = mcheck_mca_logout(MCA_MCE_SCAN, mca_allbanks, &bs, clear_bank); if (bs.errcnt) { - /* dump MCE error */ - if (mctc != NULL) - x86_mcinfo_dump(mctelem_dataptr(mctc)); - /* * Uncorrected errors must be dealth with in softirq context. */